#ifndef PAGEVIEW_H
#define PAGEVIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QWidget>
#include <QImage>
#include <QList>
#include <QWheelEvent>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QTimer>
#include <QHash>
#include <QPointer>
#include <QRect>
#include <QPointF>
#include <QLabel>
#include <memory>
#include <optional>
#include "pagenumber_v2_simplified.h"  // 新类型系统
// 前向声明
class UnifiedPageRenderer;
class GlobalPageManager;
class PageDisplayStrategy;
class ProcessingSettings;
class PageView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit PageView(QWidget *parent = nullptr);
    ~PageView();
    void setPages(const QList<QImage>& pages);
    // 新增：携带布局矩形的一次性设置
    void setPages(const QList<QImage>& pages, const QHash<int, QHash<int, QRect>>& layoutRects);
    void setCurrentPage(int index);
    bool isEmpty() const { return m_pages.isEmpty(); }
    int pageCount() const { return m_pages.size(); }
    QImage getPageImage(int index) const;
    int currentPage() const { return m_currentPage; }
    void saveZoomLevel();
    void retranslateUi();
    // 高亮功能
    void setHighlightedThumbnail(int thumbnailIndex, int totalThumbnails, int columnMode = 1);
    void clearHighlight();
    // 滚动控制
    void setShouldCenterOnUpdate(bool shouldCenter);
    // 懒加载支持
    void updatePageContent(int pageIndex, const QImage& newPageImage);
    void expandTotalPageCount(int newTotalPages);
    // 滚动位置保护方法
    void setPagesPreservingScroll(const QList<QImage>& pages);
    void updatePagesWithoutReset(const QList<QImage>& pages);
    // 处理状态管理
    void setProcessingMode(bool processing);
    bool isProcessingMode() const { return m_isProcessingMode; }
    // 渐进式页面更新（类似VirtualThumbnailView）
    void enableProgressivePageUpdate(bool enabled);
    void refreshPagesFromCache(const QString& fileIdentity);
    void updateProcessingProgress(int completedPages, int totalPages);
    // 统一的缩略图点击处理：设置页面和高亮
    void setCurrentPageWithHighlight(int pageIndex, int thumbnailIndex, int totalThumbnails, int columnMode);
    // 提取的页面渲染方法
    QImage renderCurrentPage(int pageIndex, bool exportMode = false);
    // 统一渲染器相关（新增）
    void setUnifiedRenderer(UnifiedPageRenderer* renderer);
    void forceUpdatePageNumbers(); // 强制更新页码显示，用于响应设置变化
    
    // ========== 类型安全API（V2） ==========
    /**
     * @brief 获取当前页面的全局页码上下文
     * @return 页码上下文，如果无文件则返回nullopt
     */
    std::optional<PageNumberV2::GlobalPageContext> getCurrentContext() const;
    
    // ========== 旧API（兼容层） ==========
    int getCurrentPageNumber() const;
    int getTotalPageCount() const;
    // 处理设置相关
    void setProcessingSettings(ProcessingSettings* settings);
    // Martin Fowler重构：统一全局页数数据源
    int getGlobalTotalPageCount() const;  // 获取全局总页数（所有文件）
    // === Martin Fowler重构：全局页码连续性支持 ===
    /**
     * @brief 设置当前全局页码
     * @param globalPage 全局页码（1-based）
     * @return 是否设置成功
     */
    bool setGlobalCurrentPage(int globalPage);
    /**
     * @brief 获取当前全局页码
     * @return 当前全局页码（1-based），如果无文件则返回0
     */
    int getGlobalCurrentPage() const;
    /**
     * @brief 设置文件的全局起始页码（文件加载时调用）
     * @param globalStartPage 文件的全局起始页码（1-based）
     */
    void setFileGlobalStartPage(int globalStartPage);
    /**
     * @brief 获取文件的全局起始页码
     * @return 文件的全局起始页码（1-based）
     */
    int getFileGlobalStartPage() const;
    /**
     * @brief 支持全局页码的页面设置（文件切换时使用）
     * @param pages 页面图像列表
     * @param globalStartPage 文件的全局起始页码（1-based）
     */
    void setPagesWithGlobalOffset(const QList<QImage>& pages, int globalStartPage);
    /**
     * @brief 支持全局页码和布局矩形的页面设置
     * @param pages 页面图像列表
     * @param layoutRects 布局矩形映射
     * @param globalStartPage 文件的全局起始页码（1-based）
     */
    void setPagesWithGlobalOffset(const QList<QImage>& pages,
                                  const QHash<int, QHash<int, QRect>>& layoutRects,
                                  int globalStartPage);

    // 欢迎消息支持
    void setWelcomeMessage(const QString& message);
signals:
    /**
     * @brief 页码显示更新信号
     * @param currentPage 当前页码
     * @param totalPages 总页数
     */
    void pageDisplayUpdated(int currentPage, int totalPages);
    void pageChanged(int newPage);
    void thumbnailClicked(int thumbnailIndex);  // 新增：缩略图点击信号
    void needMorePages(int startIndex, int count);  // 新增：需要加载更多页面的信号
    void logMessage(const QString& message);  // 新增：日志消息信号
public slots:
    void fitWidth();
    void fitHeight();
    void zoomIn();
    void zoomOut();
protected:
    void resizeEvent(QResizeEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void dragEnterEvent(QDragEnterEvent* event) override;
    void dropEvent(QDropEvent* event) override;
private:
    QGraphicsScene* m_scene;
    QList<QImage> m_pages;
    int m_currentPage;
    QImage m_scaledImage;
    double m_scrollOffset;
    double m_zoomLevel;
    // 高亮相关
    // 高亮状态由统一渲染器管理，不再需要这些成员变量
    // 滚动控制
    bool m_shouldCenterOnUpdate;  // 是否在更新时居中显示
    // 懒加载支持
    int m_totalPageCount;  // 总页面数（包括未加载的）
    QList<bool> m_pageLoaded;  // 跟踪哪些页面已加载
    ProcessingSettings* m_processingSettings;              // 处理设置（依赖注入）
    // 处理状态标志
    bool m_isProcessingMode;
    // 渐进式页面更新相关
    bool m_progressiveUpdateEnabled;
    QString m_currentFileIdentity;
    QTimer* m_progressiveUpdateTimer;
    // 统一渲染器（新增）
    UnifiedPageRenderer* m_unifiedRenderer;
    // === Martin Fowler重构：全局页码支持 ===
    /**
     * @brief 当前文件的全局起始页码（1-based）
     * 用于计算当前文件中页面对应的全局页码
     */
    int m_globalStartPage = 1;  // 默认为1，全局页码是1-based的

    // 欢迎消息支持
    QString m_welcomeMessage;
    QLabel* m_welcomeLabel;
    void updateScaledImage();
    void initializeView();
    void restoreZoomLevel();
    int getCurrentVisiblePage() const;
    void drawHighlightRectangles(int pageWidth, int pageHeight);
    // Martin Fowler重构：Extract Method - 统一渲染逻辑
    QImage renderWithUnifiedRenderer(const QImage& originalImage, int pageIndex, bool exportMode);
    int calculateThumbnailIndexFromPosition(const QPointF& scenePos, int pageWidth, int pageHeight, int columnMode, int totalThumbnails);
    void checkNeedMorePages();  // 检查是否需要加载更多页面
    bool checkPageContainsPlaceholder(const QImage& pageImage, int pageIndex);  // 检查页面是否包含占位符
    // 方案3：智能占位符处理
    QPair<int, int> getCurrentVisiblePageRange();  // 获取当前可见页面范围
    bool hasPlaceholderPages();  // 检查是否有占位符页面
    bool detectGeometricPatterns(const QImage& pageImage, int centerX, int centerY) const;  // 检测几何图案
    // 重用组合图画图逻辑计算页面位置
    QRect calculatePagePositionInComposite(int thumbnailIndex, int currentPage, int columnMode, int pageWidth, int pageHeight);
    // 可选：由MainWindow注入的“精准矩形”，优先使用
    // key: compositeIndex -> (originalPageIndex -> QRect)
public:
    void setAccurateLayoutRects(const QHash<int, QHash<int, QRect>>& rects) {
        m_accurateLayoutRects.clear(); // 确保完全清除旧数据
        m_accurateLayoutRects = rects;
        m_approxFallbackWarned = false; // 重置兜底告警标志
        for (auto it = rects.begin(); it != rects.end(); ++it) {
        }
    }
private:
    QHash<int, QHash<int, QRect>> m_accurateLayoutRects;
    bool m_approxFallbackWarned = false;  // 近似算法兜底的低频告警标志
};
#endif // PAGEVIEW_H